home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
knowhow4
/
event.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-10
|
7KB
|
282 lines
#include <dos.h>
#include <conio.h>
#include "event.h"
#include "mouse2.h"
typedef void interrupt (far * interruptptr)(...);
extern EventDriver * eventdriverp;
extern int get_key();
/*
mousestatus mousegetstatus()
{ mousestatus m;
m.buttonstate=0;
m.x=m.y=0;
if(eventdriverp->mouse_present) m= mouseGetStatus();
return m;}
/*/
////////////////////////
int key2event (unsigned bioskeycode);
unsigned get_shift_keys()
{
return * (unsigned far *) MK_FP(0x40,0x17);
}
inline unsigned press(unsigned New,unsigned Old)
{ return New && (! Old);}
inline unsigned release(unsigned New,unsigned Old)
{ return Old && (! New);}
#define test_mk(button,presscode,releasecode) \
if (press(news.buttonstate & button,olds.buttonstate & button))\
difference|=presscode;\
if (release(news.buttonstate & button,olds.buttonstate & button))\
difference|=releasecode;
static
unsigned compare_mousestatus(const mousestatus& news,const mousestatus& olds)
{
unsigned difference=0;
if(news.buttonstate!=olds.buttonstate)
{
test_mk(MOUSELEFT,mouseeventlow::MSLP ,mouseeventlow::MSLR )
test_mk(MOUSERIGHT,mouseeventlow::MSRP ,mouseeventlow::MSRR )
test_mk(MOUSECENTER,mouseeventlow::MSCP ,mouseeventlow::MSCR )
}
if(! ((news.where())==(olds.where()))) difference|=mouseeventlow::MSMOVE;
int DoubleCl=news.buttonstate & 0x700;
if( DoubleCl != (olds.buttonstate & 0x700) )
difference |=DoubleCl;
return difference;
}
#undef test_mk
int keyboard101()
{
return (( * (char far *) MK_FP(0x40,0x96) ) & 0x10) != 0 ;
}
static
shiftkeychangetype compare_shiftstatus(unsigned new_shift,char new_del,
unsigned old_shift,char old_del)
{ enum {MASK=0xf3ff};
static unsigned long odd_bits[] = {
0x00000001,0x00000004,0x00000010,0x00000040,
0x00000100,0x00000400,0x00001000,0x00004000,
0x00010000,0x00040000,0x00100000,0x00400000,
0x01000000,0x04000000,0x10000000,0x40000000};
static unsigned long even_bits[]= {
0x00000002,0x00000008,0x00000020,0x00000080,
0x00000200,0x00000800,0x00002000,0x00008000,
0x00020000,0x00080000,0x00200000,0x00800000,
0x02000000,0x08000000,0x20000000,0x80000000 };
new_shift &= MASK;
old_shift &= MASK;
unsigned bit; int i; unsigned long res;
for(bit=1,i=0,res=0;i<16;i++,bit<<=1)
{
if(bit & new_shift) res|=odd_bits[i];
if(bit & old_shift) res|=even_bits[i];
}
unsigned long mask;
for(mask=0x3;mask!=0l;mask<<=2)
if( (res & mask)==mask ) res^=mask;
if(new_del && !old_del) res|=KCDelDn;
if(! new_del && old_del) res|=KCDelUp;
if(keyboard101())
{
if(! ( (KCltCtrlDn | KCltCtrlUp) & res) )
{ if((KCCtrlDn | KCCtrlUp)&res) res|=KCrtCtrl;}
if(! ( (KCltAltDn | KCltAltUp) & res) )
{ if((KCAltDn |KCAltUp)&res)res|=KCrtAlt;}
}
return res;
}
event readevent(int mask)
{ int k;
event result;
result.what=NOEVENT;
result.kbstatus=get_shift_keys();
result.msstatus=mouseGetStatus2();
result.Delpressed=EventDriver::Delispressed;
if (! result.what && mask & SHIFTKEYEVENT)
{
shiftkeychangetype shiftchange;
shiftchange=compare_shiftstatus(result.kbstatus ,result.Delpressed,
EventDriver::oldkbstatus,EventDriver::olddelpressed);
if(shiftchange)
{
result.kbchange=shiftchange;
result.what=SHIFTKEYEVENT;
}
}
if(!result.what && mask & KEYEVENT)
{
k=get_key();
if (k!=EVENT_NO)
{ result.what=KEYEVENT; result.key= k;}
}
if (! result.what && mask & MOUSEEVENT)
{
unsigned mousechange=
compare_mousestatus(result.msstatus,EventDriver::oldmsstatus);
if (mousechange)
{
result.mousechange=mousechange;
result.what=MOUSEEVENT;
}
}
EventDriver::oldkbstatus=result.kbstatus;
EventDriver::oldmsstatus=result.msstatus;
EventDriver::olddelpressed=result.Delpressed;
return result;
}
//**********************************************
int eventavail(int mask,int mousemask)
{
if(mask & KEYEVENT) if(kbhit()) return 1;
if(mask & MOUSEEVENT)
{ mousestatus mstatus=mouseGetStatus2();
unsigned change=
compare_mousestatus(mstatus,EventDriver::oldmsstatus)
& mousemask;
//!!!!
if(!change) EventDriver::oldmsstatus=mstatus; // "eat up" event
if(change) return 1;
}
if(mask & SHIFTKEYEVENT)
{
unsigned kbstatus=get_shift_keys();
int Delpressed=EventDriver::Delispressed;
shiftkeychangetype shiftchange;
shiftchange=compare_shiftstatus(kbstatus ,Delpressed,
EventDriver::oldkbstatus,EventDriver::olddelpressed);
//!!!!
if(shiftchange!=0)return 1;
}
return 0;
}
event getevent(int mask,int mousemask)
{ event evt;
do{
do{
while(!eventavail(mask,mousemask));
evt=readevent(mask);
}
while(!evt);
if( evt.what!=MOUSEEVENT ) return evt;
if (evt.mousechange & mousemask) return evt;
} while(1);
}
/*
event getevent(int mask,int mousemask)
{ event evt;
thebeginning:
do{
evt=readevent(mask);
} while(! evt);
if( evt.what!=MOUSEEVENT ) return evt;
if (evt.mousechange & mousemask) return evt;
goto thebeginning; // I'm soo-o bad
}
*/
// Event Driver Static Vars
void far * EventDriver::oldkbhandler;
unsigned EventDriver::oldkbstatus=0;
mousestatus EventDriver::oldmsstatus={0,0,0};
volatile char EventDriver::Delispressed=0;
unsigned char EventDriver::break_code=0;
char EventDriver::olddelpressed=0;
static EventDriver * theEventDriverp;
static void start_() { theEventDriverp=new EventDriver;}
static void exit_() {delete theEventDriverp;}
#pragma startup start_ 90
#pragma exit exit_ 90
EventDriver::EventDriver()
{
oldkbhandler=getvect(0x9);
setvect(0x9,(interruptptr)EventDriver::kbhandler);
oldkbstatus=get_shift_keys();
oldmsstatus=mouseGetStatus2();
olddelpressed=Delispressed;
}
#define DEL_SCAN 0x53
void far interrupt EventDriver::kbhandler()
{ typedef void (far * farfunc)();
unsigned char scan=inportb(0x60);
scan|=break_code;
break_code= scan==0xf0 ? 0x80 : 0;
if ( scan==DEL_SCAN ) Delispressed=1;
if ( scan==(DEL_SCAN |0x80)) Delispressed=0;
asm pushf;
(farfunc(oldkbhandler))();
}
EventDriver::~EventDriver()
{
setvect(0x9,(interruptptr)oldkbhandler);
}